//  Copyright (C) 2000 Tridia Corporation. All Rights Reserved.
//  Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
//
//  This file is part of the VNC system.
//
//  The VNC system is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
//  USA.
//
// TightVNC distribution homepage on the Web: http://www.tightvnc.com/
//
// If the source code for the VNC system is not available from the place 
// whence you received this file, check http://www.uk.research.att.com/vnc or contact
// the authors on vnc@uk.research.att.com for information on obtaining it.
#include <cassert>
#include "VNCviewerApp32.h"
#include "Advnc_Swapper.h"
#include "Exception.h"
#include "VSocket.h"

// --------------------------------------------------------------------------
VNCviewerApp32::VNCviewerApp32(HINSTANCE hInstance, PSTR szCmdLine) :
	VNCviewerApp(hInstance, szCmdLine)
{
	m_pdaemon = NULL;
	ListenMode();
}

	
// These should maintain a list of connections.
// FIXME: Eliminate duplicated code, see the following three functions.

// void VNCviewerApp32::NewConnection() {
// 	int retries = 0;
// 	ClientConnection *pcc;
// 	ClientConnection *old_pcc;
// 
// 	pcc = new ClientConnection(this);
// 	while (retries < MAX_AUTH_RETRIES) {
// 		try {
// 			pcc->Run();
// 			return;
// 		} catch (AuthException &e) {
// 			e.Report();
// 			//--pcc->UnloadConnection();
// 			// If the connection count drops to zero, the app exits.
// 			old_pcc = pcc;
// 			pcc = new ClientConnection(this);
// 			// Get the previous options for the next try.
// 			//--pcc->CopyOptions(old_pcc);
// 			delete old_pcc;
// 		} catch (Exception &e) {
// 			e.Report();
// 			break;
// 		}
// 		retries++;
// 	}
// 	delete pcc;
// }

// void VNCviewerApp32::NewConnection(TCHAR *host, int port) {
// 	int retries = 0;
// 	ClientConnection *pcc;
// 	ClientConnection *old_pcc;
// 
// 	pcc = new ClientConnection(this, host, port);
// 	while (retries < MAX_AUTH_RETRIES) {
// 		try {
// 			pcc->Run();
// 			return;
// 		} catch (AuthException &e) {
// 			e.Report();
// 			// If the connection count drops to zero, the app exits.
// 			old_pcc = pcc;
// 			pcc = new ClientConnection(this, host, port);
// 			// Get the previous options for the next try.
// 			//--pcc->CopyOptions(old_pcc);
// 			delete old_pcc;
// 		} catch (Exception &e) {
// 			e.Report();	
// 			break;
// 		}
// 		retries++;
// 	}
// 	delete pcc;
// }

void VNCviewerApp32::NewConnection(VSocket * sock) {
   assert(NULL != sock);
   if (NULL != sock) {
      int retries = 0;
      ClientConnection *pcc;
      ClientConnection *old_pcc;

      pcc = new ClientConnection(this, sock);
      while (retries < MAX_AUTH_RETRIES) {
      try {
         pcc->Run();
         return;
      } catch (AuthException &e) {
               e.Report();
               // If the connection count drops to zero, the app exits.
               old_pcc = pcc;
               pcc = new ClientConnection(this, sock);
               // Get the previous options for the next try.
               //--pcc->CopyOptions(old_pcc);
               delete old_pcc;
            } catch (Exception &e) {
            e.Report();
            break;
         }
         retries++;
      }
      delete pcc;
   }
}

void VNCviewerApp32::ListenMode() {

	try {
		m_pdaemon = new Daemon(5500);
	} catch (WarningException &e) {
		char msg[1024];
		sprintf(msg, "Error creating listening daemon:\n\r(%s)\n\r%s",
				e.m_info, "Perhaps another VNCviewer is already running?");
		MessageBox(NULL, msg, "VNCviewer error", MB_OK | MB_ICONSTOP);
		exit(1);
	}
}

VNCviewerApp32::~VNCviewerApp32() {
	// We don't need to clean up pcc if the thread has been joined.
	if (m_pdaemon != NULL) delete m_pdaemon;
}
	
